package flm.fiado.tela.pendura;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import flm.fiado.bean.Pessoa;
import flm.fiado.dao.memory.PessoaDAO;
import flm.fiado.exception.DaoException;
import flm.fiado.tela.TelaUtil;
import flm.fiado.tela.pessoa.TelaPessoa;
import flm.fiado.util.LeiouteCadastroBuilder;


public class TelaPendura1 extends JDialog implements ActionListener, MouseListener {

	private JButton voltar;
	public String valor = null;
	private DefaultListModel listModel;
	private JTextField txtNome;
	private JButton btBuscar;
	private JPanel panel;
	private JTable table;
	private JButton btNovo;

	public TelaPendura1() throws DaoException {

		setTitle("Selecione a pessoa");//Definindo o titulo da tela
		setModal(true);
		setSize(800,600);
		TelaUtil.centralizar(this);
		
		PessoaDAO pessoaDAO = new PessoaDAO();
		
		List<Pessoa> listaPessoas = pessoaDAO.buscarTodos();
		
		this.listModel = new DefaultListModel();

		this.voltar = criaBotao("Voltar");

		panel = new JPanel();
		
		atualizarGrid(listaPessoas);
	
		LeiouteCadastroBuilder leiaute = new LeiouteCadastroBuilder(this);
		this.txtNome = new JTextField(15);
		this.btBuscar = TelaUtil.criaBotao(this, "Buscar");
		this.btNovo = TelaUtil.criaBotao(this, "Nova Pessoa");
		leiaute
			.inicio(1, 1)
				.esq().add(new JLabel("Nome"), 1)
				.esq().add(txtNome, 1)
				.esq().add(btBuscar, 1)
				.dir().add(btNovo, 1)
			.novaLinha()
				.add(new JLabel("  "))
			.novaLinha()
				.esq().add(panel, 4)
			.novaLinha()
				.dir().add(this.voltar, 1);
		
		
		
		setResizable(false);
		setVisible(true);
	}

	private void atualizarGrid(List<Pessoa> listaPessoas) {
		panel.setLayout(new GridLayout(1,0));

        DefaultTableModel tableModel = new DefaultTableModel() {
        	public boolean isCellEditable(int row,
                    int column) {
        		return false;
        	}
        };
        
        tableModel.addColumn("ID");
        tableModel.addColumn("Prenome");
        tableModel.addColumn("Sobrenome");
        tableModel.addColumn("Data Nascimento");
        tableModel.addColumn("Data Falecimento");
        
        int i = 0;
        for (Pessoa p : listaPessoas) {
        	addRecord(tableModel, p);
        }
        
        table = new JTable(tableModel);
        table.setPreferredScrollableViewportSize(new Dimension(650,450));
        table.setFillsViewportHeight(true);

        table.addMouseListener(this);
        
        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        panel.add(scrollPane);
	}

	private void addRecord(DefaultTableModel tableModel, Pessoa p) {
		Object[] listaObject = new Object[5];//colunas
		int c = 0;
		listaObject[c++] = p.getId();
		listaObject[c++] = p.getPrenome();
		listaObject[c++] = p.getSobrenome();
		listaObject[c++] = TelaUtil.dateToString(p.getDataNascimento());
		listaObject[c++] = TelaUtil.dateToString(p.getDataFalecimento());
		
		tableModel.addRow(listaObject);
	}
	
	private JButton criaBotao(String textoBotao) {
		JButton botao = new JButton(textoBotao);
		botao.addActionListener(this);
		return botao;
	}
	

	@Override
	public void actionPerformed(ActionEvent event) {
		try {
			if (event.getSource() == this.btBuscar) {
				PessoaDAO pessoaDao = new PessoaDAO();
				String nome = this.txtNome.getText();
				List<Pessoa> listaPessoas = pessoaDao.buscarPorNome(nome);
				
				recarregaTabela(listaPessoas);
			} else if (event.getSource() == this.btNovo) {
				new TelaPessoa(true);
			} else if (event.getSource() == this.voltar) {
				this.dispose();
			}
		} catch (DaoException e) {
			JOptionPane.showMessageDialog(this, "Ocorreu um erro ao acessar a base, contate seu fornecedor", "Erro", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		} 
	}

	
	private void recarregaTabela(List<Pessoa> listaPessoas) {
		DefaultTableModel tableModel = (DefaultTableModel) this.table.getModel();
		tableModel.setRowCount(0);
		for (int i = 0; i < listaPessoas.size(); i++) {
			Pessoa p = listaPessoas.get(i);
        	addRecord(tableModel, p);
		}
		this.table.setModel(tableModel);
		
	}

	@Override
	public void mouseClicked(MouseEvent event) {
		if (event.getClickCount() == 2) {
			
			int row = table.getSelectedRow();
			DefaultTableModel tableModel = (DefaultTableModel) this.table.getModel();
			int idPessoa = (Integer)tableModel.getValueAt(row, 0);
			
			PessoaDAO pessoaDao = new PessoaDAO();
			try {
				Pessoa pessoa = pessoaDao.buscarPorId(idPessoa);
				
				this.setVisible(false);
				new TelaPendura2(pessoa);
				this.dispose();
			} catch (DaoException e) {
				JOptionPane.showMessageDialog(this, "Ocorreu um erro ao acessar a base, contate seu fornecedor", "Erro", JOptionPane.ERROR_MESSAGE);	
				e.printStackTrace();
			}
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
					new TelaPendura1();
				} catch (DaoException e) {
					e.printStackTrace();
				}
            }
        });
    }
}
